package com.ruoyi.controller;


import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.entity.StorageConfig;
import com.ruoyi.common.entity.dto.StorageTypeDTO;
import com.ruoyi.common.service.StorageConfigService;
import com.ruoyi.utils.DecryptUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 存储配置Controller
 * @author 0617
 */
@RestController
@RequestMapping("/storage")
@Validated
public class StorageConfigController {

    @Autowired
    private StorageConfigService storageConfigService;
    
    @Autowired
    private DecryptUtil decryptUtil;

    /**
     * 获取阿里云OSS配置
     */
    @GetMapping("/aliyun")
    public ResponseEntity<StorageConfig> getAliyunConfig() {
        return ResponseEntity.ok(storageConfigService.getByStorageType("aliyun"));
    }

    /**
     * 保存阿里云OSS配置
     */
    @PostMapping("/aliyun")
    public ResponseEntity<Boolean> saveAliyunConfig(@Valid @RequestBody StorageConfig config) throws Exception {
        // 解密前端加密的数据
        decryptUtil.decryptStorageConfig(config);

        config.setStorageType("aliyun");
        return ResponseEntity.ok(storageConfigService.saveOrUpdateConfig(config));
    }

    /**
     * 获取七牛云配置
     */
    @GetMapping("/qiniu")
    public ResponseEntity<StorageConfig> getQiniuConfig() {
        return ResponseEntity.ok(storageConfigService.getByStorageType("qiniu"));
    }

    /**
     * 保存七牛云配置
     */
    @PostMapping("/qiniu")
    public ResponseEntity<Boolean> saveQiniuConfig(@Valid @RequestBody StorageConfig config) throws Exception {
        // 解密前端加密的数据
        decryptUtil.decryptStorageConfig(config);

        config.setStorageType("qiniu");
        return ResponseEntity.ok(storageConfigService.saveOrUpdateConfig(config));
    }

    /**
     * 获取腾讯云COS配置
     */
    @GetMapping("/tencent")
    public ResponseEntity<StorageConfig> getTencentConfig() {
        return ResponseEntity.ok(storageConfigService.getByStorageType("tencent"));
    }

    /**
     * 保存腾讯云COS配置
     */
    @PostMapping("/tencent")
    public ResponseEntity<Boolean> saveTencentConfig(@Valid @RequestBody StorageConfig config) throws Exception {
        // 解密前端加密的数据
        decryptUtil.decryptStorageConfig(config);

        config.setStorageType("tencent");
        return ResponseEntity.ok(storageConfigService.saveOrUpdateConfig(config));
    }

    /**
     * 测试存储配置连接
     */
    @PostMapping("/test/{type}")
    public ResponseEntity<Boolean> testStorageConnection(
            @PathVariable String type, 
            @Valid @RequestBody StorageConfig config) throws Exception {
        
        // 解密前端加密的数据
        decryptUtil.decryptStorageConfig(config);
        
        config.setStorageType(type);
        return ResponseEntity.ok(storageConfigService.testConnection(config));
    }

    // 获取默认存储服务器类型
    @GetMapping("/default")
    public AjaxResult getDefaultStorage() {
        // 调用Service查询is_default=1的存储配置
        StorageConfig defaultConfig = storageConfigService.getDefaultConfig();
        if (defaultConfig != null) {
            return AjaxResult.success(defaultConfig.getStorageType());
        }
        return AjaxResult.success(""); // 无默认配置时返回空
    }

    // 保存默认存储服务器类型
    @PostMapping("/default")
    public AjaxResult saveDefaultStorage(@RequestBody StorageTypeDTO storageType) {
        // 允许保存local类型，无需校验配置（本地存储无需数据库配置）
        if ("local".equals(storageType.getStorageType())) {
            // 将默认类型设为local（具体实现根据数据库设计调整）
            storageConfigService.setDefaultConfig("local");
            return AjaxResult.success("默认存储服务器设置成功");
        }
        // 其他类型仍需校验配置（原有逻辑）
        boolean result = storageConfigService.setDefaultConfig(storageType.getStorageType());
        if (result) {
            return AjaxResult.success("默认存储服务器设置成功");
        }
        return AjaxResult.error("设置失败，请检查存储类型是否存在");
    }
}
